При помощи общей модели авторегресии-скользящего среднего \[φ(B)x_{t}=θ(B)\epsilon_{t}\] можно вполне адекватно описывать достаточно широкий класс временных рядов. Но если задаться построением наиболее экономичной (с точки зрения количества оцениваемых параметров) модели, то в некоторых случаях небольшая ее модификация позволяет значительно уменьшить число параметров модели. В первую очередь это касается так называемых сезонных временных рядов, в которых наблюдается определенное сходство в поведении наблюдений, разделенных по времени на фиксированный пероид времени s. Пусть во временном ряде \(z_{t}\) нам удалось связать наблюдения, отстоящие друг от друга на время s в модель \[Φ_{P}(B^{s})∇_{s}^{D}z_{t}=Θ_{Q}(B^{s})a_{t} (*)\]
Где \(Φ_{P}(B^{s})\) и \(Θ_{Q}(B^{s})\) полиномы степени \(P,Q\) соответственно вида \[Φ_{P}(B^{s})=1-Φ_1B^{s}-...-Φ_{P}B^{Ps}\] \[Θ_{Q}(B^{s})=1-Θ_1B^{s}-...-Θ_{Q}B^{Qs}\] которые удовлетворяют условиям стационарности и обратимости, a \[∇_{s}^{D}=(1-B^{s})^{D}\] оператор сезонной разности порядка \(D\)
Ошибки \(a_{t}\) здесь не обязательно должны быть некоррелированными, так как наличие связи между переменными через период времени s не означает, что нет связи между соседними значениями ряда \(z_{t}\) и \(z_{t-1}\) или переменными, отстоящими друг от друга на два, три и т.д. моментами времени. Чтобы учесть и эту связь мы вводим еще одну модель \[φ(B)∇^{d}a_{t}=θ(B)\epsilon_{t}\]
где \(\epsilon_{t}\)- уже белый шум, а \(φ(B)\) и \(θ(B)\) полиномы по \(B\) степени \(p\) и \(q\) соответсвенно, также удовлетворяющие условиям стационарности и обратимости. Подставляя последнее выражение в (*) получим окончательную общую модель \[φ(B)Φ_{P}(B^{s})∇^{d}∇_{s}^{D}z_{t}=Θ_{Q}(B^{s})θ(B)\epsilon_{t} \] (**)
которую и называют сезонной моделью авторегресии проинтегрированного скользящего среднего и обозначают \(SARMA(p,q,d)(P,Q,D)\)
Таким образом мы задаем мультипликативную модель сезонности.
Для идентификация сезонных моделей также широко используется АКФ и ЧАКФ. Ранее мы вводили понятие производящей функции автокорреляций. Напомню это
\[\gamma(z)= \sum_{k=-\infty}^{\infty}c_kz^k\]
Для выяснения характеров их поведения ACF и PACF нам поможет тот факт, что производящая функция автоковариаций процесса заданного мультипликативно равна произведению производящих функций его компонент. Т.е. если компоненты \[φ(B)∇^{d}a_{t}=θ(B)\epsilon_{t}\] \[\Phi_{P}(B^{s})\Delta^{D}z_t=\Theta_{Q}(B^s)a_t\] имеют производящие функции АКФ \(γ(B),Γ(B)\) соответсвенно, то производящая функция автоковариаций процесса \(z_{t}\) равна \(γ(B)Γ(B)\)
Проще всего найти выражение для модели сезонного скользящего среднего. \[x_t=\Theta_Q(B^s)\theta_q(B)\epsilon_t\]. Для такой модели производящие функции автокорреляций равны \[γ(B)=\sigma^2_{\epsilon}\theta_q(B)\theta(B^{-1})\],\[\Gamma(B)=\sigma^2_{a} \Theta_Q(B^s)\Theta_Q(B^{-s})\] Cледовательно для всего процесса она будет \[C(B)=\sigma^2_{\epsilon}\sigma^2_{a}\theta_q(B)\Theta_Q(B^s)\theta_q(B^{-1})\Theta_Q(B^{-s})\]
В этой модели \(\theta_q(B)=1 - \theta_1B\),\(\Theta_Q(B^s)=1 - \Theta_1B^s\) поэтому \[c(B)= \sigma^2_{\epsilon}\sigma^2_{a}(1 - \theta_1B)(1 - \theta_1B^{-1})(1 - \Theta_1B^s)(1 - \Theta_1B^{-s})\] Перемножая полиномы, получим, что отличны от нуля будут коэффициенты при степени \(0,1,,...,s-1,s,s+1\)
library(polynom)
library(fArma)
## Loading required package: timeDate
## Loading required package: timeSeries
## Loading required package: fBasics
##
## Rmetrics Package fBasics
## Analysing Markets and calculating Basic Statistics
## Copyright (C) 2005-2014 Rmetrics Association Zurich
## Educational Software for Financial Engineering and Computational Science
## Rmetrics is free software and comes with ABSOLUTELY NO WARRANTY.
## https://www.rmetrics.org --- Mail to: info@rmetrics.org
season <- 7
theta1 <- 0.6
Theta1 <- 0.8
ma <- c(1,theta1)
sma <- c(1,rep(0,season-1),Theta1)
ma <- as.polynomial(ma)
sma <- as.polynomial(sma)
ma
## 1 + 0.6*x
sma
## 1 + 0.8*x^7
sma_ma <- ma *sma
sma_ma
## 1 + 0.6*x + 0.8*x^7 + 0.48*x^8
ma_vec <- sma_ma[2:length(sma_ma)]
ma_vec
## [1] 0.60 0.00 0.00 0.00 0.00 0.00 0.80 0.48
Оценим ACF по модели
model <- list(ma=ma_vec)
armaTrueacf(model=model,lag.max = 30,type = "correlation")
## lag acf
## 0 0 1.0000000
## 1 1 0.4411765
## 2 2 0.0000000
## 3 3 0.0000000
## 4 4 0.0000000
## 5 5 0.0000000
## 6 6 0.2152080
## 7 7 0.4878049
## 8 8 0.2152080
## 9 9 0.0000000
## 10 10 0.0000000
## 11 11 0.0000000
## 12 12 0.0000000
## 13 13 0.0000000
## 14 14 0.0000000
## 15 15 0.0000000
## 16 16 0.0000000
## 17 17 0.0000000
## 18 18 0.0000000
## 19 19 0.0000000
## 20 20 0.0000000
## 21 21 0.0000000
## 22 22 0.0000000
## 23 23 0.0000000
## 24 24 0.0000000
## 25 25 0.0000000
## 26 26 0.0000000
## 27 27 0.0000000
## 28 28 0.0000000
## 29 29 0.0000000
## 30 30 0.0000000
Смоделируем сезонный ряд
sma <- armaSim(model = list(ma=ma_vec),n = 300)
matplot(sma,type = "l",col = "blue",main = "Simulated Seasonal Time Series",lwd = 2)
Оценим ACF по ряду
acf(sma,lag.max=30,lwd = 3)
Для сезонного скользящего среднего произвольного порядка SARMA(0,Q,0)(0,q,0) c периодом сезонности \(s\) нетрудно убедиться, что отличны от нуля будут тольк значения ACF на задержках \[0,1,...,q,...,s-q,...,s-1,s,s+1,...,s+q,....,sQ-q,...,sQ-1,sQ,sQ+1,...,sQ+q\]
Для PACF без доказательсва примем на веру тот факт, что PACF процесса сезонного сколящего среднего экспоненциально затухает.
Здесь нам опять помогут уравнения Юла-Уокера из прошлой лекции. Из них немедленно следует, что PACF процесса SARMA(p,0)(P,0) сезонной авторегресссии с периодом сезонности \(s\) вида \[(1-\Phi_1B^s+\Phi_2B^{2S}+...+\Phi_PB^{Ps})x_t=a_t\] \[(1-\phi_1B-\phi_2B^2-...-\phi_pB^P)a_t=\epsilon_t\] будет отлична от нуля на задержках \[0,1,...,p,...,s-p,...,s-1,s,s+1,...,s+p,....,sP-p,...,sP-1,sP,sP+1,...,sP+p\]
Для ACF аналогично доказывается, как и в Лекции 3,только более громоздко, что ACF представляет собой экспоненциально затухающие косинусоиды.
Модель имеет вид \[x_t=\Phi_1x_{t-s} + a_t\] \[a_t= \phi_1a_{t-1}+\epsilon_t\]
library(polynom)
library(fArma)
season <- 7
phi1 <- 0.4
Phi1 <- -0.3
ar <- c(1,phi1)
sar <- c(1,rep(0,season-1),Phi1)
ar <- as.polynomial(ar)
sar <- as.polynomial(sar)
ar
## 1 + 0.4*x
sar
## 1 - 0.3*x^7
sar_ar <- ar *sar
sar_ar
## 1 + 0.4*x - 0.3*x^7 - 0.12*x^8
ar_vec <- sar_ar[2:length(sar_ar)]
ar_vec
## [1] 0.40 0.00 0.00 0.00 0.00 0.00 -0.30 -0.12
Оценим ACF,PACF по модели
modelSAR <- list(ar=ar_vec)
armaTrueacf(model=modelSAR,lag.max = 30,type = "both")
## lag acf
## 0 0 1.0000000000
## 1 1 0.5210623842
## 2 2 0.2615446164
## 3 3 0.1121635265
## 4 4 0.0100146006
## 5 5 -0.0879171679
## 6 6 -0.2228709364
## 7 7 -0.4516758607
## 8 8 -0.4569890595
## 9 9 -0.3237864948
## 10 10 -0.1945490099
## 11 11 -0.0942836073
## 12 12 -0.0125400446
## 13 13 0.0723953232
## 14 14 0.1912053998
## 15 15 0.2677799811
## 16 16 0.2590866280
## 17 17 0.2008537335
## 18 18 0.1319724568
## 19 19 0.0678650290
## 20 20 0.0069322200
## 21 21 -0.0632761707
## 22 22 -0.1285891106
## 23 23 -0.1612952304
## 24 24 -0.1558646076
## 25 25 -0.1260400281
## 26 26 -0.0866122147
## 27 27 -0.0448683554
## 28 28 0.0002036427
## 29 29 0.0462513307
## 30 30 0.0823197947
Смоделируем сезонный ряд
sarma <- armaSim(model = modelSAR,n = 300)
matplot(sarma,type = "l",col = "blue",main = "Simulated Seasonal Time Series",lwd = 2)
Оценим ACF,PACF по ряду
acf(sarma,lag.max=40,lwd = 3)
pacf(sarma,lag.max=40,lwd = 3)
Помочь освоить идентификацию сезонных моделей поможет следующий фрейм
При оценке сезонных моделей используются те же методы, что и для несезонных моделей рядов. Об этом была Лекция 3. Ведь сезонные ряды это просто экономная (с точки зрения числа параметоров) форма записи обычной ARMA модели. Это методы моментов (Юла-Уокера) для сезонной авторегрессии, метод наименьших квадратов и максимального правдоподобия для произвольных сезонных моделей.
Осталось только продемострировать идентификацию и оценку параметров реального экономического сезонного ряда:Импорт в млрд. долларов Российской Федерации.
Информация о динамике объемов импорта и экспорта отражается в отчете о внешнеторговом балансе государства. Внешнеторговый баланс - разница экспорта и импорта товаров. Если экспорт превышает импорт, то образуется положительное сальдо внешнеторгового баланса или внешнеторговый профицит. Если импорт превышает экспорт, то возникает отрицательное сальдо внешнеторгового баланса или внешнеторговый дефицит. В России экспорт традиционно превышает импорт за счет масштабных экспортных поставок газа, нефти и металлов. Соответственно, сальдо торгового баланса РФ сильно зависимо от мировых цен на данные сырьевые группы товаров.
Читаем данные из файла
import <- read.csv("c:/ShurD/Alection/import.csv", header = TRUE)
head(import)
## Data Month Year Fact Forecast X Previous Currency
## 1 19.02.1997 ßíâ 97 4.730 NA ìëðä.$ NA
## 2 19.03.1997 Ôåâ 97 4.965 NA 4.73 ìëðä.$ NA
## 3 23.04.1997 Ìàð 97 5.545 NA 4.965 ìëðä.$ NA
## 4 21.05.1997 Àïð 97 6.062 NA 5.545 ìëðä.$ NA
## 5 18.06.1997 Ìàé 97 5.411 NA 6.062 ìëðä.$ NA
## 6 23.07.1997 Èþí 97 5.694 NA 5.411 ìëðä.$ NA
importFact <- ts(import$Fact ,start= c(1997,1),frequency =12)
plot(importFact ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia")
Нестационарность явно присутствует в ряде. Возьмем обычную разность \[ y_t= x_t-x_{t-1}\]
y <- diff(importFact)
plot(y ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia.Differences")
Заметна нестационарность в сезонности с периодом 12. Возьмем сезонную разность \[z_t= y_t-y_{t-12}\]
z <- diff(y,lag = 12)
plot(z ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia.Seasonal Differences")
Нестационарность по дисперсии (или как сейчас принято говорить по волатильности). Но модели таких рядов мы пока не изучали. Поэтому возьмем выделим подряд с 2006 года, после которого волатильность на вид постоянна.
zz <- z[100:216]
zz <- ts(zz,start= c(2006,5),frequency = 12 )
plot(zz ,type = "l", col = "blue",lwd = 2,main = "Import (mlrd dollar).Russia.Seasonal Differences")
Оценим ACF,PACF
zz <- zz[1:116]
par(mfrow = c(1, 2), cex = 0.9)
acf(zz, lwd = 5,main = "ACF",col = "blue",lag.max=40)
pacf(zz,lwd = 5,main = "PACF",col = "blue",lag.max=40)
Более выразительна PACF. Попробуем оценить модель сезонной авторегрессии. Период сезонности очевидно 12. Порядок сезонной авторегрессии 1. Порядок несезонной авторегрессии 3 или 4, возьмем 4. Оцениваем эту модель методом максимального правдоподобия.
modelimport <- arima(zz,order = c(4,0,0),seasonal = list(order= c(1,0,0),period = 12 ),method = "ML")
modelimport$coef
## ar1 ar2 ar3 ar4 sar1 intercept
## -0.21644967 0.03676760 0.27994636 0.13599941 -0.37447931 -0.07129735
Насколько значимы оцененные параметры можно косвенно судить по ковариационной матрице оценок
modelimport$var.coef
## ar1 ar2 ar3 ar4
## ar1 0.0084915716 0.0014197888 -3.786230e-04 -0.0020564972
## ar2 0.0014197888 0.0082429298 1.385544e-03 -0.0004030656
## ar3 -0.0003786230 0.0013855445 8.158319e-03 0.0015422504
## ar4 -0.0020564972 -0.0004030656 1.542250e-03 0.0084329584
## sar1 0.0006446262 -0.0009488153 3.667948e-05 0.0009792428
## intercept 0.0001462261 0.0003468278 3.671008e-04 0.0003519086
## sar1 intercept
## ar1 6.446262e-04 0.0001462261
## ar2 -9.488153e-04 0.0003468278
## ar3 3.667948e-05 0.0003671008
## ar4 9.792428e-04 0.0003519086
## sar1 7.568049e-03 0.0003589610
## intercept 3.589610e-04 0.0262124644
P-Значения для проверки значимости вызывать отдельно или вычислять самостоятельно. Так как оценки ассимптотически нормальные, дисперсии ошибок стоят на диагонале матрицы ковариаций. Поэтому для получения р-значений для проверки значимости делаем следующую команду
(1-pnorm(abs(modelimport$coef)/sqrt(diag(modelimport$var.coef))))
## ar1 ar2 ar3 ar4 sar1
## 9.414705e-03 3.427492e-01 9.696386e-04 6.930692e-02 8.363238e-06
## intercept
## 3.298339e-01
Другой способ такой проверки это метод coeftest из библиотеки lmtest
library("lmtest")
## Warning: package 'lmtest' was built under R version 3.2.4
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
##
## time<-
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
coeftest(modelimport)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.216450 0.092150 -2.3489 0.018829 *
## ar2 0.036768 0.090791 0.4050 0.685498
## ar3 0.279946 0.090323 3.0994 0.001939 **
## ar4 0.135999 0.091831 1.4810 0.138614
## sar1 -0.374479 0.086995 -4.3046 1.673e-05 ***
## intercept -0.071297 0.161903 -0.4404 0.659668
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Остатки после исключения модели и усредненная сумма квадратов остатков
par(mfrow = c(1, 1), cex = 0.9)
modelimport$sigma2
## [1] 3.248453
importresid <- modelimport$residuals
plot(importresid ,type = "l", col = "blue",lwd = 2,main = "Residuals")
проведем тест Льюнг-Бокса остатков и постром qq-график
Box.test(importresid, lag = 16, type = "Ljung-Box", fitdf = 2)
##
## Box-Ljung test
##
## data: importresid
## X-squared = 20.122, df = 14, p-value = 0.1263
qqnorm(importresid)
qqline(importresid)
Остатки явно не нормально распределены, имеют очень тяжелые хвосты Построим ACF,PACF остатков
par(mfrow = c(1, 2), cex = 0.9)
pacf(importresid,lwd = 5,lag.max = 40, col = "blue")
acf(importresid,lwd = 5,lag.max = 40, col = "blue")
Похоже модель выбрана не лучшим образом. Попробуем другую модель. Порядок сезонного скользящего среднего 1, а не сезонного 3. Повторим оценку уже другой модели.
modelimport2 <- arima(zz,order = c(0,0,3),seasonal = list(order= c(0,0,1),period = 12 ),method = "ML")
coeftest(modelimport2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.258841 0.091417 -2.8314 0.004634 **
## ma2 0.050746 0.087772 0.5782 0.563159
## ma3 0.218558 0.086069 2.5393 0.011107 *
## sma1 -0.665206 0.117588 -5.6571 1.54e-08 ***
## intercept -0.076175 0.067536 -1.1279 0.259359
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow = c(1, 1), cex = 0.9)
modelimport2$sigma2
## [1] 2.820544
importresid2 <- modelimport2$residuals
plot(importresid2 ,type = "l", col = "blue",lwd = 2,main = "Residuals")
Box.test(importresid2, lag = 16, type = "Ljung-Box", fitdf = 2)
##
## Box-Ljung test
##
## data: importresid2
## X-squared = 13.874, df = 14, p-value = 0.4592
qqnorm(importresid2)
qqline(importresid2)
par(mfrow = c(1, 2), cex = 0.9)
pacf(importresid2,lwd = 5,lag.max = 40, col = "blue")
acf(importresid2,lwd = 5,lag.max = 40, col = "blue")
Ну вот и так мы оценили достаточно адекватную модель SARMA(3,0)(0,1) остатки гипотезе, что это белый шум не противоречат, но их нормальность явно под вопросом. Тест Шапиро (см Лекцию 2.) нормальности это подтверждает, точнее гипотеза о нормальности остатков отвергается.
shapiro.test(importresid2)
##
## Shapiro-Wilk normality test
##
## data: importresid2
## W = 0.95513, p-value = 0.0006707
Для сравнения результатов оценки по нескольким моделям и выбора лучшей из них Х.Акаике (1974) был предложен следующий критерий. В общем случае AIC: \[\mathit{AIC} = 2k - 2\ln(L)\,\] где \(k\) — число параметров в статистической модели, и \(L\) — максимизированное значение функции правдоподобия модели.
Будем полагать, что ошибки модели нормально и независимо распределены. Пусть \(n\) — число наблюдений и RSS- \[\mathit{RSS} = \sum_{i=1}^n \hat{\varepsilon}_i^2\], остаточная сумма квадратов. Далее мы предполагаем, что дисперсия ошибок модели неизвестна, но одинакова для всех них. Следовательно: \[\mathit{AIC}=2k + n[\ln(2\pi \mathit{RSS}/n) + 1]\,\]. В случае сравнения моделей на выборках одинаковой длины, выражение можно упростить, выкидывая члены зависящие только от n: \[\mathit{AIC}=2k + n[\ln(\mathit{RSS})]\,\]. Таким образом, критерий не только вознаграждает за качество приближения, но и штрафует за использование излишнего количества параметров модели. Считается, что наилучшей будет модель с наименьшим значением критерия AIC. Сравним значения критерия для двух моделей, которые мы оценили выше.
modelimport$aic
## [1] 481.9704
modelimport2$aic
## [1] 468.7346
Что потверждает наши предположения, о том, что вторая модель предпочтительней.Стоит отметить, что абсолютное значение AIC не имеет смысла — он указывает только на относительный порядок сравниваемых моделей.